#pragma once

#include "IDigraph.h"
#include <vector>
#include <string>

void setRandSeed(int new_seed);
void testAlgorithms(const std::unique_ptr<IDigraph> &graph);
void testGraphIntegrity(const std::unique_ptr<IDigraph> &graph, const std::vector<Edge> &edges, int vertices_num);
void testProcessOrder(const std::unique_ptr<IDigraph> &graph, const std::vector<Edge> &order, int type);
void testBasic();
void testCondesedGraph(const std::unique_ptr<IDigraph> &graph, const std::unique_ptr<IDigraph> &condensed, const std::vector<int> &colors);
void testStronglyConnectedComponents(const std::unique_ptr<IDigraph> &graph, const std::vector<int> &components);
void testTarjanOnGraph(const std::unique_ptr<IDigraph> &graph);
void testTarjan();
int check2SATSolution(const std::vector<int> &result, const std::vector<Edge> &edges, int variables);
void test2SAT();

std::string generateTests(int type_of_tests, int max_vertices_num, std::vector<Edge> &edges, int &vertices_num);
std::vector<Edge> generateFunctional(int vertices_num);
std::vector<Edge> generateClique(int vertices_num);
std::vector<Edge> generateAcyclic(int vertices_num);
std::vector<Edge> generateRandomized(int vertices_num);
std::vector<Edge> generateTree(int vertices_num);